package top.ruanlitao.shortlink.project.toolkit;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.net.URL;

@Slf4j
public class WebsiteFetcherUtil {

    /**
     * 获取指定网站的图标URL。
     *
     * @param websiteUrl 网站的完整URL (例如, "https://www.github.com")
     * @return 图标的绝对URL，如果找不到则返回 null
     */
    public static String getFaviconUrl(String websiteUrl) {
        try {
            // 1. 使用 Jsoup 连接到网站并获取HTML文档
            // 设置 User-Agent 模拟浏览器，防止被某些网站阻止
            Document doc = Jsoup.connect(websiteUrl)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
                    .get();

            // 2. 在 <head> 中寻找 <link> 标签来定位图标
            // 我们使用一个 CSS 选择器来查找所有可能是图标的 <link> 标签。
            // rel~=(?i)icon: rel 属性包含 "icon" 这个词（不区分大小写）
            // rel~=apple-touch-icon: 苹果设备的高清图标
            Elements iconLinks = doc.select("head link[rel~=(?i)icon|apple-touch-icon]");

            if (!iconLinks.isEmpty()) {
                // 通常第一个或最后一个是最好的选择，这里我们简单地取第一个
                // 更高级的逻辑可以根据 'sizes' 属性选择分辨率最高的图标
                Element link = iconLinks.first();

                // 3. 获取 href 属性并转换为绝对 URL
                // link.absUrl("href") 是 Jsoup 的一个强大功能，它会自动处理相对路径 (如 /favicon.png)
                // 并将其转换为完整的绝对路径 (如 https://www.example.com/favicon.png)
                String iconUrl = link.absUrl("href");

                if (!iconUrl.isEmpty()) {
                    return iconUrl;
                }
            }

            // 4. Fallback（回退）策略：如果 link 标签未找到，尝试网站根目录下的 /favicon.ico
            System.out.println("在 <link> 标签中未找到图标，尝试回退到 /favicon.ico...");
            URL url = new URL(websiteUrl);

            // 注意：这个回退URL不保证一定存在，但它是标准的备用方案
            // 你可以进一步通过发送一个HTTP HEAD请求来验证该URL是否有效（返回200 OK）
            return url.getProtocol() + "://" + url.getHost() + "/favicon.ico";

        } catch (IOException e) {
            System.err.println("访问URL时出错: " + websiteUrl + " - " + e.getMessage());
            return null;
        } catch (IllegalArgumentException e) {
            System.err.println("无效的URL格式: " + websiteUrl + " - " + e.getMessage());
            return null;
        }
    }

    /**
     * 获取指定 URL 网站的标题 (title)。
     *
     * @param url 目标网站的完整 URL (例如, "https://www.google.com")
     * @return 网站的标题字符串。如果发生错误或找不到标题，则返回 null。
     */
    public static String getWebsiteTitle(String url) {
        try {
            // 1. 使用 Jsoup 连接到网站并获取 Document 对象
            // 我们还设置一个超时时间 (5000 毫秒)，防止程序因网络问题长时间卡住
            Document doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
                    .timeout(5000) // 5秒超时
                    .get();

            // 2. 直接使用 Jsoup 提供的 .title() 方法获取标题
            // 这是获取 <title> 标签内容最简单、最直接的方式。
            return doc.title();

        } catch (IOException e) {
            log.error("访问URL时发生 I/O 错误: {} - {}", url, e.getMessage());
            // 在发生网络错误时返回
            return "network error: " + e.getMessage();
        } catch (IllegalArgumentException e) {
            log.error("提供了无效的 URL: {} - {}", url, e.getMessage());
            // 在URL格式错误时返回
            return "invalid URL: " + e.getMessage();
        }
    }

    public static void main(String[] args) {
        /*String iconUrl = WebsiteFetcherUtil.getFaviconUrl("https://search.bilibili.com/all?keyword=reactor%E6%A8%A1%E5%9E%8B&from_source=webtop_search&spm_id_from=333.1007&search_source=5");
        System.out.println("图标URL: " + iconUrl);*/
        String websiteTitle = WebsiteFetcherUtil.getWebsiteTitle("https://jsoup.org/");
        System.out.println("网站标题: " + websiteTitle);
    }
}